package com.shujia.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo03Map {
  def main(args: Array[String]): Unit = {
    // 创建Spark Context
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo03Map")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    // 构建RDD 通过Scala中的集合构建
    val intRDD: RDD[Int] = sc.parallelize(List(1, 2, 3, 4, 5, 6, 7))

    val kvRDD: RDD[(String, String)] = sc.makeRDD(List(("k1", "v1"), "k2" -> "v2"))


    /**
     * Spark中常用的算子：
     * Transformations 转换算子：将一个RDD变成另一个RDD 懒执行 需要一个Action算子触发执行
     * Actions 行为算子 操作算子：将RDD变成Scala中的类型 触发一个Job
     *
     * 如果区分 转换算子/行为算子？
     * 就看算子的返回值是不是RDD
     *
     * Spark任务的层级： Application -> Job -> Stage -> Task
     * Job的数量由Action算子的数量决定
     */
    // 将每个数*2

    /**
     * map转换算子 同List中的map方法类似
     * 将RDD中的每一条数据传入map中接收的方法f 进行转换得到一个新的RDD
     *
     * foreach行为算子 同List中的foreach方法类似
     * 将RDD中的每一条数据传入foreach中接收的方法f 相比map而言 它没有返回值
     * 一般用于最后将数据输出或者保存到外部系统
     */
    val int2RDD: RDD[Int] = intRDD
      .map(i => {
        println("进入了map处理逻辑")
        i * 2
      })
    // 每个Action算子都会触发一个Job
    int2RDD.foreach(println)// foreach Action行为算子 可以触发任务Job
    int2RDD.foreach(println)// foreach Action行为算子 可以触发任务Job
    int2RDD.foreach(println)// foreach Action行为算子 可以触发任务Job
    int2RDD.foreach(println)// foreach Action行为算子 可以触发任务Job
    int2RDD.foreach(println)// foreach Action行为算子 可以触发任务Job

    // Scala中的List调用map方法
    List(1, 2, 3, 4, 5).map(i => {
      println("进入了List的map处理逻辑")
      i * 3
    })


    while (true) {

    }


  }

}
